共计 2843 个字符,预计需要花费 8 分钟才能阅读完成。
一. 路由介绍 (Routers)
1.router 的作用
对于视图集 ViewSet,我们除了可以自己手动指明请求方式与动作 action 之间的对应关系外,还可以使用 Routers 来帮助我们快速实现路由信息
2.REST framework 提供的两个 route
- SimpleRouter (简单的路由) (两条)
- DefaultRouter (默认的路由) (六条)
二. 使用方法
1. 使用步骤
- 前提 : 必须是继承了 ViewSetMixin 类的视图 + 9 种视图子类才可以使用路由组件快速生成路由
- 导入路由类 :
from rest_framework.routers import SimpleRouter,DefaultRouter
- 实例化得到对象 :
router = SimpleRouter()
- 注册路由 :
router.register('book2',views.BookView)
- 把自动生成的路由加到 urlpatterns 中去 :
urlpatterns += router.urls
2. 参数介绍及注意点
- register 方法参数
# 查看其源码
def register(self, prefix, viewset, basename=None):
...
# prefix : 路由前缀
# viewset : 视图集
# basename : 路由别名
prefix
参数不需要加前缀
router.register('book2',views.BookView) # book2 不需要加前缀
3. 代码示例
- models.py
from django.contrib.auth.models import AbstractUser
class base(models.Model):
name = models.CharField(max_length=16)
price = models.IntegerField()
class Mate:
abstract = True # 声明这张表是张抽象表, 不会在数据库中进行创建, 只用来给别的模型类继承
class Book2(base): # 继承了 base, 就会有 base 中的字段
nid = models.AutoField(primary_key=True)
author = models.CharField(max_length=16, null=True)
publish = models.CharField(max_length=16, null=True)
abstract
一般用于多个模型类中存在相同的字段, 为了避免重复书写相同的字段, 可以使用abstract
指定一张抽象表用作继承
- serializers.py
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book2
fields = "__all__"
- views.py
from rest_framework.viewsets import ModelViewSet
from mydrf.serializers import BookSerializer
class BookView(ModelViewSet):
queryset = models.Book2.objects.all()
serializer_class = BookSerializer
- urls.py
# 1. 导入路由类
from rest_framework.routers import SimpleRouter,DefaultRouter
# 2. 实例化得到对象
router = SimpleRouter()
# 3. 注册路由
router.register('book2',views.BookView)
print(router.urls) # 自动生成的路由
'''[<URLPattern'^book2/$'[name='book2-list']>, <URLPattern'^book2/(?P<pk>[^/.]+)/$'[name='book2-detail']>]'''
urlpatterns = []
# 4. 把自动生成的路由加到 urlpatterns 中去 (实际上就是两个列表相加)
urlpatterns += router.urls
- 查看 SimpleRouter 自动生成的路由 (两条)
- 查看 SimpleRouter 自动生成的路由 (六条)(有根, 可以通过根访问)
三. 添加路由的另一种方式
- urls.py 文件
# 需要导入 include
from django.urls import path,include
urlpatterns = [path(r'',include(router.urls))
]
# 或者添加前缀
urlpatterns = [path(r'app1/',include(router.urls))
]
四. action 装饰器的使用
1. 作用
- 为我们在视图集中自定义的方法生成路由
class BookView(ModelViewSet):
queryset = models.Book2.objects.all()
serializer_class = BookSerializer
# 自定义的方法不会自动生成路由, 需要添加 action 装饰器
def index(self, request):
return Response('ok!')
# 不会自动生成路由
def top5(self, request):
return Response('get_5_ok!')
2.action 的参数说明
method
: 声明该 action 对应的请求方式, 使用列表传递
# 查看其源码 :
methods = ['get'] if (methods is None) else methods
methods = [method.lower() for method in methods]
# 第一条如果没有指定该参数, 默认是 "get" 方法
# 第二条表示方法可以大小写, 它都会将其转换成小写
detail
: 声明该 action 的路径是否与单一资源对应, 布尔值
# True : 表示不是单一资源路径 (可以用来匹配一条数据) :
例:127.0.0.1:8000/<pk>/[action 方法名]/
# False : 表示单一的资源路径 (可以匹配多条数据) :
例:127.0.0.1:8000/[action 方法名]/
3.action 装饰器的使用
# 先导入 action
from rest_framework.decorators import action
class BookView(ModelViewSet):
queryset = models.Book2.objects.all()
serializer_class = BookSerializer
@action(methods=['get'],detail=False)
def index(self, request):
return Response('ok!')
@action(methods=['post'],detail=True)
def top5(self, request):
return Response('get_5_ok!')
正文完